package com.xros.demo.fileserver.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 * @ClassName GetFileTypeUtil
 * @Description 魔术工具类
 * @Author JiJiang
 * @Date 2023/9/9 20:30
 * @Version 1.0
 */


public class MagicNumberUtils {



    public static boolean checkIsDirByMagicNum(String fileMagicNum){

        return "0000000000000000000000000000000000000000".equals(fileMagicNum);

    }

    /**
     * 获取文件头部的16进制字符串
     *
     * @param inputStream 文件输入流对象
     * @return
     * @throws IOException
     */
    public static String getFileHeaderHexStr(InputStream inputStream) {


        final byte[] header = new byte[20];

        try {
            /**
             * int read() 从此输入流中读取一个数据字节。int read(byte[] b) 从此输入流中将最多 b.length
             * 个字节的数据读入一个 byte 数组中。 int read(byte[] b, int off, int len)
             *从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
             * 之所以从输入流中读取20个字节数据，是因为不同格式的文件头魔数长度是不一样的，比如 EML("44656C69766572792D646174653A")和GIF("47494638")
             * 为了提高识别精度所以获取的字节数相应地长一点
             */
            inputStream.read(header, 0, 20);
        } catch (IOException e) {
            System.out.println("类：\"" + MagicNumberUtils.class.getName() + "\"执行方法：\"" + "\"时异常！原因如下：\r\n" + e.getMessage());
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    System.out.println("类：\"" + MagicNumberUtils.class.getName() + "\"执行方法：\"" + "\"时异常！原因如下：\r\n" + e.getMessage());
                }
            }
        }
        return bytesToHexString(header);
    }

    /**
     * 将文件的头部转为16进值
     *
     * @param fileHeader
     * @return 16进制字符串
     * @description 第二步：将文件头转换成16进制字符串
     */
    private static String bytesToHexString(byte[] fileHeader) {
        StringBuilder stringBuilder = new StringBuilder();
        if (fileHeader == null || fileHeader.length <= 0) {
            return null;
        }

        String hv = null;
        int v = 0;
        for (int i = 0; i < fileHeader.length; i++) {
            v = fileHeader[i] & 0xFF;
            hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
//        System.out.println("文件类型16进制字符串是" + stringBuilder.toString());
        return stringBuilder.toString();
    }




    //region （描述：测试代码块）

    public static void main(String[] args) {

        String filePath = "C:\\Users\\mzp\\Desktop\\记事本.txt";
        filePath = "D:\\images\\girl01.jpg";

        try {
            final String fileHeaderHexStr = getFileHeaderHexStr(new FileInputStream(filePath));
            System.out.println("文件："+filePath+"的16进制魔数值为："+fileHeaderHexStr);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }


    }


    //endregion

}